<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
  /***
   *
   * 中介者模式：通过中介者对象封装一系列对象之间的交互，使对象之间不在相互引用
   * 降低他们之间的耦合度,有时中介者对象也可改变对象之间的交互
   *
   * 中介者与观察者很相似，都是负责模块间或者类之间的消息通信
   * 但是观察者是双向消息传输，对象既可以当做消息发布者也可以当做消息的接受者
   * 而中介者模式这是一对多的关系，对象只可以单方面的接受中介者对象的消息
   *
   ***/
//  中介者对象
  let Mediator = (function () {
  //  消息对象
    let _msg = {};
    return {
      /***
       *
       * 订阅消息方法
       * 参数 type 消息名称
       * 参数 action 消息回调函数
       *
       ***/
      register : function (type,action){
      //  如果消息存在
        if(_msg[type]){
        //  存入回调函数
          _msg[type].push(action);
        }else{
        //  不存在就新建一个消息列表
          _msg[type] = [];
          //存入新消息回调函数
          _msg[type].push(action)
        }
      },
      /***
       *
       * 发布消息方法
       * 参数 type 消息名称
       *
       ***/
      send:function (type) {
      //  如果消息已经被订阅
        if(_msg[type]){
        //  遍历已存储的消息回调函数
          for(let i = 0;i<_msg[type].length;i++){
            //执行回调函数
            _msg[type][i]()
          }
        }
      }
    }
  })()

//  浅浅测试一下
//  订阅demo消息
  Mediator.register('demo',function () {
    console.log('订阅');
  })
//  订阅demo消息
  Mediator.register('demo',function (){
    console.log('又订阅')
  })
//  发布demo消息
  Mediator.send('demo')
</script>
</body>
</html>
